package com.powernode.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.powernode.entity.Goods;
import com.powernode.entity.Orders;
import com.powernode.mapper.OrderMapper;
import com.powernode.service.GoodsService;
import com.powernode.service.OrderService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.TransactionManagementConfigurationSelector;
import org.springframework.transaction.annotation.Transactional;

/**
 * 订单服务实现类
 * 继承MyBatis-Plus的ServiceImpl，实现OrderService接口
 * 负责秒杀场景下的订单创建、库存扣减等核心业务逻辑
 */
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService {
    @Resource
    private GoodsService goodsService; // 注入商品服务，用于查询商品信息和扣减库存

    /**
     * 执行下单操作
     * 包含库存检查、库存扣减和订单插入的完整业务流程
     * 使用@Transactional注解确保所有数据库操作在一个事务中完成
     *
     * @param orders 订单对象，包含用户ID、商品ID、购买数量等信息
     * @return 1表示下单成功，异常表示下单失败
     * @throws RuntimeException 当库存不足、库存扣减失败或订单插入失败时抛出
     */
    @Transactional // 事务注解：确保库存扣减和订单插入操作要么同时成功，要么同时失败
    @Override
    public int doOrder(Orders orders) {
        // 1. 查询商品信息：根据订单中的商品ID获取商品详情
        Goods goods = goodsService.getById(orders.getGoodsId());

        // 2. 判断库存是否充足
        if (goods.getStore() <= 0) {
            // 库存不足时抛出运行时异常，事务将回滚
            throw new RuntimeException("库存不足");
        }

        // 3. 扣减库存：使用UpdateWrapper构造更新条件
        UpdateWrapper<Goods> updateWrapper = new UpdateWrapper<>();
        // 设置库存扣减SQL：store = store - 1（每次减少1个库存）
        updateWrapper.setSql("store = store - 1");
        // 设置更新条件：商品ID等于订单中的商品ID
        updateWrapper.eq("id", orders.getGoodsId());

        // 执行库存更新操作
        boolean update = goodsService.update(updateWrapper);
        // 判断库存更新是否成功（可能因并发导致更新失败）
        if (!update) {
            throw new RuntimeException("扣减库存失败");
        }

        // 4. 插入订单记录到数据库
        boolean save = save(orders);

        // 判断订单插入是否成功
        if (!save) {
            throw new RuntimeException("插入订单失败");
        }

        // 5. 下单成功，返回1
        return 1;
    }

    @Override
    public Orders queryOrderByUidAndGoodsId(Integer uid, Integer goodsId) {
        QueryWrapper<Orders> wrapper = new QueryWrapper<>();
        wrapper.eq("uid", uid);
        wrapper.eq("goods_id", goodsId);
        return baseMapper.selectOne(wrapper);
    }
}